package czk.concrent.enjoyModelWithNotLock.phaser;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Phaser;

/**
 * Phaser 常见用途：
 * 多阶段任务：Phaser 可以用于将一个任务分解为多个阶段，每个阶段由多个线程并行执行，等待所有线程完成当前阶段后再进入下一个阶段。
 * 多阶段并行算法：Phaser 可以用于实现多阶段的并行算法，每个阶段的计算可以由多个线程同时进行，等待所有线程完成当前阶段后再进入下一阶段。
 * 多线程协作：Phaser 可以用于多个线程之间的协作，实现一种分治的并发编程模式。
 * Phaser 的主要方法包括：
 * arriveAndAwaitAdvance()：使当前线程到达同步点并等待其他线程，直到所有线程都到达同步点后才继续执行。
 * arriveAndDeregister()：使当前线程到达同步点并注销，不再参与后续的同步操作。
 * getPhase()：获取当前阶段的编号。
 * register()：注册一个线程，使其参与后续的同步操作。
 *
 * @Author:ChenZhangKun
 * @Date: 2022/9/19 16:53
 */
public class PhaserDemo {
    public static void main(String[] args) {
        Phaser phaser=new Phaser(5);
        Runnable r=()->{
            System.out.println("phase-0");
            phaser.arriveAndAwaitAdvance();
            // 恢复
            System.out.println("phase-1");
            phaser.arriveAndAwaitAdvance();
            System.out.println("phase-2");
            phaser.arriveAndDeregister();
        };
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 5; i++) {
            executorService.submit(r);
        }
    }
}
